package chapter05

/**
  *
  * @author Pop
  * @date 2022/6/13 22:14
  *
  *      匿名函数
  */
object Test05_Lambda {

  def main(args: Array[String]): Unit = {
    // 这个匿名函数的类型 String => Unit
    val stringToUnit: String => Unit = (name:String) => {println(name)}
    val fun = stringToUnit
      // 匿名函数的调用
      fun("pop")

    // 另一种方式，将函数变为参数传入、
    def f(func:String => Unit ):Unit = {
      func("pop")
    }

    // 匿名函数的简化原则
    // 参数的类型可以省略，会根据形参来进行推导
    f((name)=>{
      println(name)
    })
    // 类型省略后，发现只有一个参数，则圆括号可以省略，没有参数或者函数超过1的情况下，括号一定不能省略
    f(name=>{println(name)})
    // 匿名函数只有一行，则大括号可以省略
    f(name=>println(name))
    // 如果参数只出现一次，则参数省略且后面参数可以省略,使用下划线代替
    f(println(_))
    // 如果可以推断出当前传入的printlin是一个函数体，而不是调用语句，可以直接省略下划线
    f(println)


    def func1(func:(Int,Int)=>Int):Int={
      func(1,2)
    }

    val param1 = (a:Int,b:Int)=>{a+b}
    func1(param1)
    //
    func1((a,b)=>a+b)
    // 当参数只出现一次，且a与b只出现一次
    func1(_+_)
    //但是，如果你调用是
    func1((a,b)=>b-a)
    // 就无法简写，但是换个思路，你这个可不可以写成
    func1((a,b)=> -a+b)
    func1(-_+_)
  }

}
